package com.jdaw.datastructure.hashtab;

public class HashTabDemo {
    public static void main(String[] args) {
        HashTab hashTab=new HashTab(7);
        Emp emp=new Emp("李华",8);
        Emp emp1=new Emp("李华1",9);
        Emp emp2=new Emp("李华2",8);
        hashTab.add(emp);
        hashTab.add(emp1);
        hashTab.add(emp2);
        System.out.println(hashTab.findEmpById(7));
    }
}

class HashTab{
    private EmpLinkedList[] empLinkedListArray;
    private int size;

    public HashTab(int size){
        this.size=size;
        empLinkedListArray=new EmpLinkedList[size];
        for(int i=0;i<size;i++){
            empLinkedListArray[i]=new EmpLinkedList();
        }
    }

    //添加Emp
    public void add(Emp emp){
        //根据Emp的id找到要添加的链表，用散列函数添加
        int empLinkedListNo=hashFun(emp.id);
        empLinkedListArray[empLinkedListNo].add(emp);
    }

    //遍历hashtab的所有链表
    public void lsit(){
        for(int i=0;i<empLinkedListArray.length;i++){
            empLinkedListArray[i].list(i);
        }
    }

    //查找Emp
    public Emp findEmpById(int id){
        int no=hashFun(id);
        Emp emps=empLinkedListArray[no].findEmpById(id);
        if(emps==null){
            System.out.println("哈希表中没找到该Emp");
            return null;
        }else{
            return emps;
        }
    }

    //散列函数，简单取模法
    public int hashFun(int id){
        return id%size;
    }
}

class Emp{
    public String name;
    public int id;
    public Emp next;//默认为空

    public Emp(String name, int id) {
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

class EmpLinkedList{
    public Emp head;

    //CRUD方法
    public void add(Emp emp){
        //假定Emp添加是安装id自增添加，每次都加到链表最后
        if(head==null){
            head=emp;
            return;
        }
        Emp curEmp=head;
        while(true){
            if(curEmp.next==null){
                break;
            }
            curEmp=curEmp.next;
        }
        curEmp.next=emp;
    }

    //遍历链表
    public void list(int no){
        if(head==null){
            System.out.println("当前"+no+"链表信息为空");
            return;
        }
        Emp curEmp=head;
        System.out.println("当前"+no+"链表信息如下：");
        while(true) {
            System.out.println(curEmp);
            if(curEmp.next == null) {//说明curEmp已经是最后结点
                break;
            }
            curEmp = curEmp.next; //后移，遍历
        }
    }

    //查找Emp
    public Emp findEmpById(int id){
        if(head==null){
            System.out.println("链表为空");
            return null;
        }
        Emp curEmp=head;
        while(true){
            if(curEmp.id==id){
                return curEmp;
            }
            if(curEmp.next == null) {//说明curEmp已经是最后结点
                System.out.println("未找到");
                return null;
            }
            curEmp=curEmp.next;
        }
    }
}
